#ifndef CPP_WIFI_SERVICE_H
#define CPP_WIFI_SERVICE_H

#include <cvte_connect.h>

//@brief Wifi连接服务
//@author cvte
//@description 提供Wi-Fi状态的设置和获取功能
class WifiService {
   public:
    static const int WIFI_RECORD_MAX = 24;
    static WifiService* getInstance();

    class WifiServiceListener {
       public:
        virtual void onWifiStatusChanged(CVTE_WIFI_STATUS_DATA data);
        virtual void onWifiScanFinished();
    };

    //@method Wi-Fi是否已连接
    bool isConnected(void);
    //@method 获取Wi-Fi状态
    CVTE_WIFI_STATUS_DATA getStatus(void);
    //@method 开关Wi-Fi
    void switchOnOff(bool on);
    //@method 连接Wi-Fi
    void connect(const char *ssid, const char *password);
    //@method 连接无密码的Wi-Fi
    void connectWithNoPw(const char *ssid);
    //@method Wi-Fi断开
    void disconnect(void);
    //@medhot Wi-Fi扫描请求一次
    void scanOnce(void);
    //@method Wi-Fi状态请求
    void statusReq(void);
    //@method 移除网络
    void removeNetwork(const char *ssid);
    //@method 获取scan到的ap列表
    CVTE_WIFI_AP_INFO* getApListInfo(void);
    //@method 清除scan到的ap列表
    void cleanApListInfo(void);
    //@method 确认ssid是否在Wi-Fi记录内
    bool isApInRecord(const char *ssid);
    //@method 获取wifi连接记录信息
    CVTE_WIFI_CONNECT_INFO* getRecordInfo(const char *ssid);

    //@method 通知处理
    void notifyProc(uint32_t id_notify, uint8_t *value);
    //@method 设置监听
    void setListener(WifiServiceListener& listener);

   private:
    static WifiService* sInstance;
    int mWifiScanId; //Wi-Fi扫描标记id，仅由于区分不同扫描结果
    CVTE_WIFI_STATUS_DATA mWifiStatusData;
    CVTE_WIFI_AP_INFO mWifiApInfo[CVTE_WIFI_AP_MAX_NUM]; //搜索返回的AP列表信息
    CVTE_WIFI_CONNECT_INFO mWifiRecord[WIFI_RECORD_MAX];
    WifiServiceListener *mListener = nullptr;

    WifiService();
    virtual ~WifiService();

    //@method wpa_supplicant.conf文件解析
    void updateWpaCfg(void);
    //@method 获取已连接Wi-Fi记录
    int getRecordIndex(const char *ssid);
    //@method 更新扫描AP列表
    void updateApList(CVTE_WIFI_SCAN_RESULT *p_scan_result, bool add);
    //@method 更新Wi-Fi状态
    void updateStatus(CVTE_WIFI_STATUS_DATA *p_status_data);
};
#endif